/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import io.CajaChicaDTO;
import java.sql.*;
import java.sql.Date;
import java.util.ArrayList;

/**
 * Esta clase representa la gestion de Gestoria que se encuentra 
 * almacenada en la base de datos
 * @author Acer
 */
public class MySQLCajaChicaDAO {
    /**
     * Este método devuelve una lista con todas los movimientos de Gestoria almacenados
     * @return lista de Gestoria
     * @throws DAOException 
     */
    public ArrayList<CajaChicaDTO> listarGestoria(Date fecha) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            ResultSet rs = stat.executeQuery("select * from cajachica where fecha='"+ fecha +"' and tipo ="+ 1 +"");
            ArrayList<CajaChicaDTO> listaGestoria = new ArrayList();
            while (rs.next()) {
                CajaChicaDTO gestoria = new CajaChicaDTO(Integer.parseInt(rs.getString("id")),Integer.parseInt(rs.getString("tipo")), rs.getString("descripcion"),Double.parseDouble(rs.getString("importe")),  rs.getDate("fecha"), rs.getString("detalle"));
                  listaGestoria.add(gestoria);            
            }
            rs.close();
            return listaGestoria;
        } catch (SQLException e) {
            throw new DAOException("Error al leer desde la base de datos", e);
        }
        finally {
             MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
    /**
     * Este método devuelve una lista con todas los movimientos de Gestoria almacenados
     * @return lista de Gestoria
     * @throws DAOException 
     */
    public ArrayList<CajaChicaDTO> listarVarios(Date fecha) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            ResultSet rs = stat.executeQuery("select * from cajachica where fecha='"+ fecha +"' and tipo ="+ 3 +"");
            ArrayList<CajaChicaDTO> listaVarios = new ArrayList();
            while (rs.next()) {
                CajaChicaDTO varios = new CajaChicaDTO(Integer.parseInt(rs.getString("id")),Integer.parseInt(rs.getString("tipo")), rs.getString("descripcion"),Double.parseDouble(rs.getString("importe")),  rs.getDate("fecha"), rs.getString("detalle"));
                  listaVarios.add(varios);            
            }
            rs.close();
            return listaVarios;
        } catch (SQLException e) {
            throw new DAOException("Error al leer desde la base de datos", e);
        }
        finally {
             MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
    /**
     * Este metodo devuelve una lista con todos los movimientos de gastos que se
     * encuentran almacenados 
     * @param fecha
     * @return
     * @throws DAOException 
     */
    public ArrayList<CajaChicaDTO> listarGastos(Date fecha) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            ResultSet rs = stat.executeQuery("select * from cajachica where fecha='"+ fecha +"' and tipo ="+ 2 +"");
            ArrayList<CajaChicaDTO> listaGastos = new ArrayList();
            while (rs.next()) {
                CajaChicaDTO gastos = new CajaChicaDTO(Integer.parseInt(rs.getString("id")),Integer.parseInt(rs.getString("tipo")), rs.getString("descripcion"),Double.parseDouble(rs.getString("importe")),  rs.getDate("fecha"), rs.getString("detalle"));
                  listaGastos.add(gastos);
                }
            rs.close();
            return listaGastos;
        } catch (SQLException e) {
            throw new DAOException("Error al leer desde la base de datos", e);
        }
        finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
    
   /**
     * Este metodo calcula el total de GESTORIA de la fecha que recibe
     * como parametro
     * @return
     * @throws DAOException 
     */ 
   public double totalGestoria(Date fecha) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            ResultSet rs = stat.executeQuery("select * from cajachica where fecha='"+ fecha +"' and tipo ="+ 1 +"");
            double totalGestoria = 0.0;
            while (rs.next()) {
                totalGestoria = totalGestoria + rs.getDouble("importe");
            }
            rs.close();
            return totalGestoria;
        } catch (SQLException e) {
            throw new DAOException("Error al leer desde la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
   /**
     * Este metodo calcula el total de VARIOS de la fecha que recibe
     * como parametro
     * @return
     * @throws DAOException 
     */ 
   public double totalVarios(Date fecha) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            ResultSet rs = stat.executeQuery("select * from cajachica where fecha='"+ fecha +"' and tipo ="+ 3 +"");
            double totalVarios = 0.0;
            while (rs.next()) {
                totalVarios = totalVarios + rs.getDouble("importe");
            }
            rs.close();
            return totalVarios;
        } catch (SQLException e) {
            throw new DAOException("Error al leer desde la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
   /**
    * Este metodo calcula el total de GASTOD de la fecha que recibe
    * como parametro
    * @param fecha
    * @return
    * @throws DAOException 
    */
   public double totalGastos(Date fecha) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            ResultSet rs = stat.executeQuery("select * from cajachica where fecha='"+ fecha +"' and tipo ="+ 2 +"");
            double totalGastos = 0.0;
            while (rs.next()) {
               totalGastos = totalGastos + rs.getDouble("importe");
            }
            rs.close();
            return totalGastos;
        } catch (SQLException e) {
            throw new DAOException("Error al leer desde la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
   
        
   /**
     * Este método permite insertar un nuevo movimiento de gestoria a la base de datos
     * @param gestoria
     * @throws DAOException 
     */
    public void insertarGestoria(CajaChicaDTO gestoria) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            stat.executeUpdate("insert into cajachica (tipo,descripcion,importe,fecha,detalle) values ("+ gestoria.getTipo() + ",'" + gestoria.getDescripcion() + "'," + gestoria.getImporte() + " , '"+ gestoria.getFecha() + "', '" + gestoria.getDetalle() + "')");
        }
        catch (SQLException e) {
           throw new DAOException("Error al insertar en la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
   
   /**
     * Este método permite insertar un nuevo movimiento de varios a la base de datos
     * @param gestoria
     * @throws DAOException 
     */
    public void insertarVarios(CajaChicaDTO varios) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            stat.executeUpdate("insert into cajachica (tipo,descripcion,importe,fecha,detalle) values ("+ varios.getTipo() + ",'" + varios.getDescripcion() + "'," + varios.getImporte() + " , '"+ varios.getFecha() + "', '" + varios.getDetalle() + "')");
        }
        catch (SQLException e) {
           throw new DAOException("Error al insertar en la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
    /**
     * Este método permite insertar un nuevo movimiento de gastos a la base de datos
     * @param gastos
     * @throws DAOException 
     */
     public void insertarGastos(CajaChicaDTO gastos) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            stat.executeUpdate("insert into cajachica (tipo,descripcion,importe,fecha,detalle) values ("+ gastos.getTipo() + ",'" + gastos.getDescripcion() + "'," + gastos.getImporte() + " , '"+ gastos.getFecha() + "' , '" + gastos.getDetalle() + "')");
        }
        catch (SQLException e) {
           throw new DAOException("Error al insertar en la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
    
    /**
     * Este método permite borrar un movimiento de Gestoria
     * @param id
     * @return true si fue exitoso y false si el movimiento de gestoria no existe
     * @throws DAOException 
     */
    public boolean borrarGestoria(int id) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            if (stat.executeUpdate("delete from cajachica where id = '" + id + "'") == 0) {
                return false;
            } else {
                return true;
            }
        } catch (SQLException e) {
            throw new DAOException("Error al borrar en la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
    
    /**
     * Este método permite borrar un movimiento de Varios
     * @param id
     * @return true si fue exitoso y false si el movimiento de gestoria no existe
     * @throws DAOException 
     */
    public boolean borrarVarios(int id) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            if (stat.executeUpdate("delete from cajachica where id = '" + id + "'") == 0) {
                return false;
            } else {
                return true;
            }
        } catch (SQLException e) {
            throw new DAOException("Error al borrar en la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
    
    public boolean borrarGastos(int id) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            if (stat.executeUpdate("delete from cajachica where id = '" + id + "'") == 0) {
                return false;
            } else {
                return true;
            }
        } catch (SQLException e) {
            throw new DAOException("Error al borrar en la base de datos", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
  /**
     * Este método permite modificar los datos de un movimiento de gestoria
     * @param descripcion
     * @param importe
     * @param id
     * @throws DAOException 
     */
    public void actualizarGestoria(CajaChicaDTO gestoria) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            stat.executeUpdate("update cajachica set tipo = "+ gestoria.getTipo() + " , descripcion = '" + gestoria.getDescripcion() + "',importe = " + gestoria.getImporte() + " , fecha = '" + gestoria.getFecha() + "',detalle = '" + gestoria.getDetalle() + "' where id = " + gestoria.getId());
          } catch (SQLException e) {
            throw new DAOException("Error al actualizar en la base de datos ", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
  
  /**
     * Este método permite modificar los datos de un movimiento de varios
     * @param descripcion
     * @param importe
     * @param id
     * @throws DAOException 
     */
    public void actualizarVarios(CajaChicaDTO varios) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            stat.executeUpdate("update cajachica set tipo = "+ varios.getTipo() + " , descripcion = '" + varios.getDescripcion() + "',importe = " + varios.getImporte() + " , fecha = '" + varios.getFecha() + "',detalle = '" + varios.getDetalle() + "' where id = " + varios.getId());
          } catch (SQLException e) {
            throw new DAOException("Error al actualizar en la base de datos ", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
    /**
     * Este método permite modificar los movimientos correspondientes
     * a un gasto
     * @param gastos
     * @throws DAOException 
     */
        public void actualizarGastos(CajaChicaDTO gastos) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            stat.executeUpdate("update cajachica set tipo = "+ gastos.getTipo() + " , descripcion = '" + gastos.getDescripcion() + "',importe = " + gastos.getImporte() + " , fecha = '" + gastos.getFecha() + "', detalle = '" + gastos.getDetalle() + "' where id = " + gastos.getId());
          } catch (SQLException e) {
            throw new DAOException("Error al actualizar en la base de datos ", e);
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
    /**
     * Este mensaje permite obtener una lista gestoria de la caja chica que
     * contengan en sus atributos a los que contiene gestoria que se pasa como
     * parámetro
     * @param agenda
     * @return lista de agendas
     * @throws DAOException 
     */
      public ArrayList<CajaChicaDTO> buscarGestoria(CajaChicaDTO gestoria) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            ResultSet rs = stat.executeQuery("select * from cajachica where lower(descripcion) like lower('%"+ gestoria.getDescripcion() + "%')and lower(fecha) like lower('%" + gestoria.getFecha() + "%') and tipo="+ 1 +"");
            ArrayList<CajaChicaDTO> lista = new ArrayList();
            while (rs.next()) {
                CajaChicaDTO gestoriaDTO = new CajaChicaDTO(Integer.parseInt(rs.getString("tipo")), rs.getString("descripcion"), Double.valueOf(rs.getString("importe")), Date.valueOf(rs.getString("fecha")),rs.getString("detalle"));
                     lista.add(gestoriaDTO);}
             rs.close();
            return lista;
        } catch (SQLException e) {
            throw new DAOException("Error al leer desde la base de datos", e);  
   } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
      /**
       * Este mensaje permite obtener una lista de varios (caja chica) que
       * contengan en sus atributos a los que contiene varios que se pasa como parametro
       * @param varios
       * @return
       * @throws DAOException 
       */
      public ArrayList<CajaChicaDTO> buscarVarios(CajaChicaDTO varios) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            ResultSet rs = stat.executeQuery("select * from cajachica where lower(descripcion) like lower('%"+ varios.getDescripcion() + "%')and lower(fecha) like lower('%" + varios.getFecha() + "%') and tipo="+ 3 +"");
            ArrayList<CajaChicaDTO> lista = new ArrayList();
            while (rs.next()) {
                CajaChicaDTO variosDTO = new CajaChicaDTO(Integer.parseInt(rs.getString("tipo")), rs.getString("descripcion"), Double.valueOf(rs.getString("importe")), Date.valueOf(rs.getString("fecha")),rs.getString("detalle"));
                     lista.add(variosDTO);}
             rs.close();
            return lista;
        } catch (SQLException e) {
            throw new DAOException("Error al leer desde la base de datos", e);  
   } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }
      
  public ArrayList<CajaChicaDTO> buscarGastos(CajaChicaDTO gastos) throws DAOException {
        Connection conexion = null;
        try {
            conexion = MySQLDAOFactory.getMySQLDAOFactory().getConexion();
            Statement stat = conexion.createStatement();
            ResultSet rs = stat.executeQuery("select * from cajachica where lower(descripcion) like lower('%"+ gastos.getDescripcion() + "%')and lower(fecha) like lower('%" + gastos.getFecha() + "%')and lower (detalle) like lower('%" + gastos.getDetalle() + "%') and tipo =" + 2 + "");
            ArrayList<CajaChicaDTO> lista = new ArrayList();
            while (rs.next()) {
                CajaChicaDTO gastosDTO = new CajaChicaDTO(Integer.parseInt(rs.getString("tipo")), rs.getString("descripcion"), Double.valueOf(rs.getString("importe")), Date.valueOf(rs.getString("fecha")),rs.getString("detalle"));
                   lista.add(gastosDTO);}
           
            rs.close();
            return lista;
        } catch (SQLException e) {
            throw new DAOException("Error al leer desde la base de datos", e);  
        } finally {
            MySQLDAOFactory.getMySQLDAOFactory().cerrarConexion(conexion);
        }
    }    
}
